package com.itfenghuang.day07;

import java.util.HashSet;
import java.util.Objects;

public class A03_Hash {
    /** java是 c语言开发的
     *
     *  1.哈希表
     *  jdk1.8之前:  数组+链表
     *  jdk1.8之后:  数组+链表+红黑树
     *  2.哈希值
     *    根据对象的地址值或字符串或数字 计算出来的int类型的数值
     *      哈希值怎么获取
     *      就是Object中的hashCode()方法
     *  3.HashSet去重
     *      计算该 元素的哈希值,调用hashCode()方法,如果两个元素
     *      的哈希值相同,那么会调用equals方法进行比较,如果使用
     *      equals()方法比较的结果为true,那么会触发去重,hashset认为
     *      两个元素相同的,进行去重,如果是false,会将元素挂在链表上
     *
     */
    public static void main(String[] args) {
        //需求:创建一个hashSet对象,用来存储学生  name age
        HashSet<Student> set = new HashSet<>();
        set.add(new Student("爆爆",15));
        set.add(new Student("爆爆",15));
        set.add(new Student("提莫",45));
        System.out.println(set);

    }
}
class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public int compareTo(Student o) {
        //主要条件
        int i=this.age-o.age;
        //次要条件
        int i1 = i == 0 ? this.name.compareTo(o.name):i;
        return i1;
    }
}